Pilot data Parse bio 4 iPSC lines NPCs, 3 batches

Load libraries

library(Seurat)
The legacy packages maptools, rgdal, and rgeos, underpinning this package
will retire shortly. Please refer to R-spatial evolution reports on
https://r-spatial.org/r/2023/05/15/evolution4.html for details.
This package is now running under evolution status 0 
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Attaching SeuratObject
Warning message:
R graphics engine version 15 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.2     ✔ purrr   1.0.1
✔ tibble  3.2.1     ✔ dplyr   1.1.2
✔ tidyr   1.3.0     ✔ stringr 1.5.0
✔ readr   2.1.3     ✔ forcats 0.5.2
── Conflicts ─────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
#library(CelltypeR)
seu
An object of class Seurat 
58395 features across 23769 samples within 1 assay 
Active assay: RNA (58395 features, 2500 variable features)
 2 dimensional reductions calculated: pca, umap

Idents(seu) <- 'sample'
VlnPlot(seu, pt.size = 0.001, features = c("nFeature_RNA"))
VlnPlot(seu, pt.size = 0.001, features = "nCount_RNA")

VlnPlot(seu, pt.size = 0.001, features = "percent.mt")

Add in labels for batch and disease status and line

#library("CelltypeR")
# CelltypeR library is a library I (Rhalena) made for flow cytometry but uses the seurat object and I made a quick add annotations function.

Seurat_Parse12sample <- seu

# here is the function
annotate <- function(seu, annotations, to_label, annotation_name = "CellType"){
  Idents(seu) <- to_label
  names(annotations) <- levels(seu)
  seu <- RenameIdents(seu, annotations)
  seu <- AddMetaData(object=seu, metadata=Idents(seu), col.name = annotation_name)

}

Idents(Seurat_Parse12sample) <- "sample"
sample.levels <- levels(Seurat_Parse12sample)
# should give the order of sample

# test
Seurat_Parse12sample <- annotate(Seurat_Parse12sample, annotations = sample.levels, to_label = "sample",annotation_name = "sample.test")
table(Seurat_Parse12sample$sample.test)

x2965B3 x2965B1  TD07B3 x3448B1 x3448B2  TD22B3  TD07B2 x3448B3 x2965B2 
   1918    2353    1690    2400    2194    2894    2124    1530    1686 
 TD07B1  TD22B2  TD22B1 
   1496    2186    1298 
table(Seurat_Parse12sample$sample)

 TD07B1  TD07B2  TD07B3  TD22B1  TD22B2  TD22B3 x2965B1 x2965B2 x2965B3 
   1496    2124    1690    1298    2186    2894    2353    1686    1918 
x3448B1 x3448B2 x3448B3 
   2400    2194    1530 
# these match

#input vector we got from the seurat object
# Define regular expression to match first part of the string
pattern <- "^[A-Za-z]+"

# Use gsub() to replace the first part of the string with an empty string
sample.levels.new <- gsub(pattern, "", sample.levels)

# Extract B1, B2, B3 from new vector
batch <- gsub(".*B", "B", sample.levels.new)

Seurat_Parse12sample <- annotate(Seurat_Parse12sample, annotations = batch, to_label = "sample",annotation_name = "Batch")

table(Seurat_Parse12sample$Batch)

  B3   B1   B2 
8032 7547 8190 
table(Seurat_Parse12sample$Batch,Seurat_Parse12sample$sample)
    
     TD07B1 TD07B2 TD07B3 TD22B1 TD22B2 TD22B3 x2965B1 x2965B2 x2965B3
  B3      0      0   1690      0      0   2894       0       0    1918
  B1   1496      0      0   1298      0      0    2353       0       0
  B2      0   2124      0      0   2186      0       0    1686       0
    
     x3448B1 x3448B2 x3448B3
  B3       0       0    1530
  B1    2400       0       0
  B2       0    2194       0
# add the cell line name
# sample vector is still the input vector
# Define regular expression to remove B1, B2, and B3
pattern <- "B[1-3]$"

# Use gsub() to remove B1, B2, and B3 from original vector
sample.levels.new <- gsub(pattern, "", sample.levels)

# Extract starting values from new vector
ipscline <- gsub("B[1-3]$", "", sample.levels.new)
ipscline
 [1] "x2965" "x2965" "TD07"  "x3448" "x3448" "TD22"  "TD07"  "x3448" "x2965"
[10] "TD07"  "TD22"  "TD22" 
Seurat_Parse12sample <- annotate(Seurat_Parse12sample, annotations = ipscline, to_label = "sample",annotation_name = "IPSC_Line")

table(Seurat_Parse12sample$IPSC_Line)

x2965  TD07 x3448  TD22 
 5957  5310  6124  6378 
table(Seurat_Parse12sample$IPSC_Line,Seurat_Parse12sample$sample)
       
        TD07B1 TD07B2 TD07B3 TD22B1 TD22B2 TD22B3 x2965B1 x2965B2 x2965B3
  x2965      0      0      0      0      0      0    2353    1686    1918
  TD07    1496   2124   1690      0      0      0       0       0       0
  x3448      0      0      0      0      0      0       0       0       0
  TD22       0      0      0   1298   2186   2894       0       0       0
       
        x3448B1 x3448B2 x3448B3
  x2965       0       0       0
  TD07        0       0       0
  x3448    2400    2194    1530
  TD22        0       0       0
# add disease status
# we need to know the order of the lines

Idents(Seurat_Parse12sample) <- "IPSC_Line"
line.levels <- levels(Seurat_Parse12sample)
line.levels
[1] "x2965" "TD07"  "x3448" "TD22" 
PDstatus <- c("PD","PD","Con","Con")  # if TD07 and 2965 are PD lines and TD22 and 3448 are control lines
Seurat_Parse12sample <- annotate(Seurat_Parse12sample, annotations = PDstatus, to_label = "IPSC_Line",annotation_name = "DiseaseStatus")

table(Seurat_Parse12sample$DiseaseStatus)

   PD   Con 
11267 12502 
 
table(Seurat_Parse12sample$DiseaseStatus,Seurat_Parse12sample$IPSC_Line)
     
      x2965 TD07 x3448 TD22
  PD   5957 5310     0    0
  Con     0    0  6124 6378
table(Seurat_Parse12sample$Batch,Seurat_Parse12sample$IPSC_Line)
    
     x2965 TD07 x3448 TD22
  B3  1918 1690  1530 2894
  B1  2353 1496  2400 1298
  B2  1686 2124  2194 2186

Save info

saveRDS(Seurat_Parse12sample, "Parse12sample4lines3batchJuly7.RDS")

Align the cell lines and batches, we will align across the 12 samples

# make a list of seurat objects by our cell type variable
sublist <- SplitObject(seu, split.by = "sample")
# normalize and find variable features
for (i in 1:length(sublist)){
  sublist[[i]] <- NormalizeData(sublist[[i]], verbose = FALSE)
  sublist[[i]] <- FindVariableFeatures(sublist[[i]], selection.method = "vst")
}
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# Create an empty Seurat object to store the integrated data
# Take the first Seurat object from the list as the starting point
integrated_seurat <- subset(sublist[[1]])


# Iterate over the list of Seurat objects
for (i in 1:length(sublist)) {
  # Rename the 'orig.ident' metadata inside the seurat object to match the object name in the list
  sublist[[i]]$orig.ident <- names(sublist)[i]

}

sample.list <- sublist
for (i in 1:length(sample.list)) {
  # Normalize and scale the data
  sample.list[[i]] <- NormalizeData(sample.list[[i]], verbose = FALSE)
  sample.list[[i]] <- ScaleData(sample.list[[i]], verbose = FALSE)
  # Find variable features
  sample.list[[i]] <- FindVariableFeatures(sample.list[[i]], selection.method = "vst")
  # Get the variable features
  variable_features <- VariableFeatures(sample.list[[i]])
  # Run PCA with the variable features
  sample.list[[i]] <- RunPCA(sample.list[[i]], verbose = FALSE, npcs = 30, features = variable_features)
}
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
int.anchors <- FindIntegrationAnchors(object.list = sample.list, dims = 1:30, reduction = "rpca")
Computing 2000 integration features
Scaling features for provided objects

  |                                                  | 0 % ~calculating  
  |+++++                                             | 8 % ~05s          
  |+++++++++                                         | 17% ~04s          
  |+++++++++++++                                     | 25% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04s  
Computing within dataset neighborhoods

  |                                                  | 0 % ~calculating  
  |+++++                                             | 8 % ~07s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++++++                                     | 25% ~05s          
  |+++++++++++++++++                                 | 33% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Finding all pairwise anchors

  |                                                  | 0 % ~calculating  
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 2868 anchors

  |+                                                 | 2 % ~03m 20s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 545 anchors

  |++                                                | 3 % ~03m 01s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 533 anchors

  |+++                                               | 5 % ~02m 54s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 558 anchors

  |++++                                              | 6 % ~02m 53s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 549 anchors

  |++++                                              | 8 % ~02m 56s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 424 anchors

  |+++++                                             | 9 % ~02m 50s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 467 anchors

  |++++++                                            | 11% ~02m 46s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 427 anchors

  |+++++++                                           | 12% ~02m 45s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 340 anchors

  |+++++++                                           | 14% ~02m 41s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 573 anchors

  |++++++++                                          | 15% ~02m 38s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 915 anchors

  |+++++++++                                         | 17% ~02m 38s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 912 anchors

  |++++++++++                                        | 18% ~02m 37s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 519 anchors

  |++++++++++                                        | 20% ~02m 34s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 766 anchors

  |+++++++++++                                       | 21% ~02m 33s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 738 anchors

  |++++++++++++                                      | 23% ~02m 31s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 531 anchors

  |+++++++++++++                                     | 24% ~02m 27s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 505 anchors

  |+++++++++++++                                     | 26% ~02m 24s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 464 anchors

  |++++++++++++++                                    | 27% ~02m 20s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 518 anchors

  |+++++++++++++++                                   | 29% ~02m 17s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 782 anchors

  |++++++++++++++++                                  | 30% ~02m 14s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 892 anchors

  |++++++++++++++++                                  | 32% ~02m 12s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 549 anchors

  |+++++++++++++++++                                 | 33% ~02m 09s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 493 anchors

  |++++++++++++++++++                                | 35% ~02m 05s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 432 anchors

  |+++++++++++++++++++                               | 36% ~02m 01s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 2894 anchors

  |+++++++++++++++++++                               | 38% ~01m 58s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 569 anchors

  |++++++++++++++++++++                              | 39% ~01m 55s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 713 anchors

  |+++++++++++++++++++++                             | 41% ~01m 52s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 494 anchors

  |++++++++++++++++++++++                            | 42% ~01m 49s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 798 anchors

  |++++++++++++++++++++++                            | 44% ~01m 46s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 724 anchors

  |+++++++++++++++++++++++                           | 45% ~01m 43s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 398 anchors

  |++++++++++++++++++++++++                          | 47% ~01m 39s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 456 anchors

  |+++++++++++++++++++++++++                         | 48% ~01m 37s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 415 anchors

  |+++++++++++++++++++++++++                         | 50% ~01m 34s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 931 anchors

  |++++++++++++++++++++++++++                        | 52% ~01m 31s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 570 anchors

  |+++++++++++++++++++++++++++                       | 53% ~01m 28s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 419 anchors

  |++++++++++++++++++++++++++++                      | 55% ~01m 25s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 553 anchors

  |+++++++++++++++++++++++++++++                     | 56% ~01m 22s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 573 anchors

  |+++++++++++++++++++++++++++++                     | 58% ~01m 19s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 2037 anchors

  |++++++++++++++++++++++++++++++                    | 59% ~01m 16s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 409 anchors

  |+++++++++++++++++++++++++++++++                   | 61% ~01m 13s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 413 anchors

  |++++++++++++++++++++++++++++++++                  | 62% ~01m 10s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 566 anchors

  |++++++++++++++++++++++++++++++++                  | 64% ~01m 07s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 472 anchors

  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 04s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 401 anchors

  |++++++++++++++++++++++++++++++++++                | 67% ~01m 01s      
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 365 anchors

  |+++++++++++++++++++++++++++++++++++               | 68% ~58s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 847 anchors

  |+++++++++++++++++++++++++++++++++++               | 70% ~56s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 835 anchors

  |++++++++++++++++++++++++++++++++++++              | 71% ~53s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 475 anchors

  |+++++++++++++++++++++++++++++++++++++             | 73% ~50s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 772 anchors

  |++++++++++++++++++++++++++++++++++++++            | 74% ~47s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 740 anchors

  |++++++++++++++++++++++++++++++++++++++            | 76% ~45s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 3274 anchors

  |+++++++++++++++++++++++++++++++++++++++           | 77% ~42s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 796 anchors

  |++++++++++++++++++++++++++++++++++++++++          | 79% ~39s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 717 anchors

  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~37s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 811 anchors

  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~34s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 529 anchors

  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~31s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 1402 anchors

  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~28s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 1446 anchors

  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~25s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 530 anchors

  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~22s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 582 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~19s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 443 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~17s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 1047 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~14s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 405 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~11s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 483 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 595 anchors

  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 570 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~03s          
Projecting new data onto SVD
Projecting new data onto SVD
Finding neighborhoods
Finding anchors
    Found 1021 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03m 01s
integrated_seurat <- IntegrateData(anchorset = int.anchors,  dims = 1:30)
Merging dataset 8 into 4
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 11 into 6
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 1 into 2
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 10 into 3
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 12 into 2 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 9 into 6 11
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 2 1 12 into 6 11 9
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 7 into 5
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 3 10 into 4 8
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 4 8 3 10 into 6 11 9 2 1 12
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 5 7 into 6 11 9 2 1 12 4 8 3 10
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
# 
# must set the k weight to the lowest cell count 
# in the parse sample we have over 1530 cells in the smallest count so we don't have to change the k from the 100 default

Now we need to run the workflow on the integrated object

DefaultAssay(integrated_seurat) <- "integrated"
integrated_seurat <- ScaleData(integrated_seurat, verbose = FALSE)
# only the integrated features will be the pca input

integrated_seurat <- RunPCA(integrated_seurat, npcs = 20, verbose = FALSE)
integrated_seurat <- RunUMAP(integrated_seurat, reduction = "pca", dims = 1:20, n.neighbors = 81)

Have a look at the new UMAP

DimPlot(integrated_seurat, group.by = 'sample')

DimPlot(integrated_seurat, group.by = 'Batch')

DimPlot(integrated_seurat, group.by = 'DiseaseStatus')

DimPlot(integrated_seurat, group.by = 'IPSC_Line')

NA
NA
NA
# saveRDS(integrated_seurat, "Integrated12samples.RDS")
# setwd("~/Documents/Data/scRNAseq/ParseExample/Experiment1-mini12")
intergrated_seurat <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/ParseExample/Experiment1-mini12/Integrated12samples.RDS")

Find new clusters

integrated_seurat <- FindClusters(integrated_seurat, resolution = c(0,0.3,0.6,1) )
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 23769
Number of edges: 3304295

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 1.0000
Number of communities: 1
Elapsed time: 16 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 23769
Number of edges: 3304295

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9097
Number of communities: 10
Elapsed time: 20 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 23769
Number of edges: 3304295

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8752
Number of communities: 16
Elapsed time: 23 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 23769
Number of edges: 3304295

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8382
Number of communities: 20
Elapsed time: 20 seconds

integrated_seurat <- intergrated_seurat
DimPlot(integrated_seurat, group.by = "integrated_snn_res.0.3")

DimPlot(integrated_seurat, group.by = "integrated_snn_res.0.6")

DimPlot(integrated_seurat, group.by = "integrated_snn_res.0.3", split.by = "DiseaseStatus")

table(integrated_seurat$DiseaseStatus)

  Con    PD 
12502 11267 

Annotate clusters res 0.3

write(ClusterMarkers, "clusterMarkersres03Integrated.csv")
Error in cat(x, file = file, sep = c(rep.int(sep, ncolumns - 1), "\n"),  : 
  argument 1 (type 'list') cannot be handled by 'cat'
library(enrichR)
Welcome to enrichR
Checking connection ... 
Enrichr ... Connection is Live!
FlyEnrichr ... Connection is available!
WormEnrichr ... Connection is available!
YeastEnrichr ... Connection is available!
FishEnrichr ... Connection is available!
OxEnrichr ... Connection is available!
setEnrichrSite("Enrichr") # Human genes
Connection changed to https://maayanlab.cloud/Enrichr/
Connection is Live!
# list of all the databases
# get the possible libraries
dbs <- listEnrichrDbs()

# this will list the possible libraries
dbs

# select libraries with cell types
db <- c('CellMarker_Augmented_2021','Azimuth_Cell_Types_2021')

# function for a quick look
checkCelltypes <- function(cluster_num = 0){
  clusterX <- ClusterMarkers %>% filter(cluster == cluster_num & avg_log2FC > 0.25)
  genes <- clusterX$gene
  # the cell type libraries
  # get the results for each library
  clusterX.cell <- enrichr(genes, databases = db)
  # visualize the results
print(plotEnrich(clusterX.cell[[1]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'CellMarker_Augmented_2021'))
print(plotEnrich(clusterX.cell[[2]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'Azimuth_Cell_Types_2021'))

}
#heatmap of top markers
top3 <- ClusterMarkers %>% group_by(cluster) %>% top_n(n=3, wt =avg_log2FC)
DoHeatmap(integrated_seurat, features = top3$gene, size = 3, angle = 90, group.by = "integrated_snn_res.0.3")

NA
NA
table(ClusterMarkers$cluster)

  0   1   2   3   4   5   6   7   8   9 
130  38 242 477 134 249 275 417 377 233 

Check each cluster quickly

checkCelltypes(cluster_num = 3)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

Look at some expression lists


da_neurons <- c("TH","SLC6A3","SLC18A2","SOX6","NDNF","SNCG","ALDH1A1","CALB1","TACR2","SLC17A6","SLC32A1","OTX2","GRP","LPL","CCK","VIP")
NPC_orStemLike <- c("DCX","NEUROD1","TBR1","PCNA","MKI67","SOX2","NES","PAX6","MASH1")
mature_neurons = c("RBFOX3","SYP","DLG45","VAMP1","VAMP2","TUBB3","SYT1","BSN","HOMER1","SLC17A6")
excitatory_neurons = c("GRIA2","GRIA1","GRIA4","GRIN1","GRIN2B","GRIN2A","GRIN3A","GRIN3","GRIP1","CAMK2A")
inhbitory_neurons = inh = c("GAD1","GAD2", "GAT1","PVALB","GABR2","GABR1","GBRR1","GABRB2","GABRB1","GABRB3","GABRA6","GABRA1","GABRA4","TRAK2")
astrocytes <- c("GFAP","S100B","AQP4","APOE", "SOX9","SLC1A3")
oligodendrocytes <- c("MBP","MOG","OLIG1","OLIG2","SOX10")
opc <- 
radial_glia <- c("PTPRC","AIF1","ADGRE1", "VIM", "TNC","PTPRZ1","FAM107A","HOPX","LIFR",
              "ITGB5","IL6ST","SLC1A3")
epithelial <- c("HES1","HES5","SOX2","SOX10","NES","CDH1","NOTCH1")

microglia <- c("IBA1","P2RY12","P2RY13","TREM119", "GPR34","SIGLECH","TREM2",
               "CX3CR1","FCRLS","OLFML3","HEXB","TGFBR1", "SALL1","MERTK",
               "PROS1")

features_list <- c("MKI67","SOX2","POU5F1","DLX2","PAX6","SOX9","HES1","NES","RBFOX3","MAP2","NCAM1","CD24","GRIA2","GRIN2B","GABBR1","GAD1","GAD2","GABRA1","GABRB2","TH","ALDH1A1","LMX1B","NR4A2","CORIN","CALB1","KCNJ6","CXCR4","ITGA6","SLC1A3","CD44","AQP4","S100B", "PDGFRA","OLIG2","MBP","CLDN11","VIM","VCAM1")

short_list <- c("MKI67","SOX9","HES1","NES","DLX2","RBFOX3","MAP2","TH","CALB1","KCNJ6","SLC1A3","CD44","AQP4","S100B","OLIG2","MBP","VIM")
Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in da_neurons) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find TH in the default search locations, found in RNA assay instead
Warning: Could not find SLC6A3 in the default search locations, found in RNA assay instead
Warning: Could not find SLC18A2 in the default search locations, found in RNA assay instead
Warning: Could not find SNCG in the default search locations, found in RNA assay instead
Warning: Could not find ALDH1A1 in the default search locations, found in RNA assay instead
Warning: Could not find TACR2 in the default search locations, found in RNA assay instead
Warning: Could not find SLC32A1 in the default search locations, found in RNA assay instead
Warning: Could not find OTX2 in the default search locations, found in RNA assay instead
Warning: Could not find GRP in the default search locations, found in RNA assay instead
Warning: Could not find CCK in the default search locations, found in RNA assay instead
Warning: Could not find VIP in the default search locations, found in RNA assay instead

Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in NPC_orStemLike) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find PCNA in the default search locations, found in RNA assay instead
Warning: Could not find SOX2 in the default search locations, found in RNA assay instead
Warning: Could not find NES in the default search locations, found in RNA assay instead
Warning in FetchData.Seurat(object = object, vars = c(dims, "ident", features),  :
  The following requested variables were not found: MASH1
Error: None of the requested features were found: MASH1 in slot data

Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in astrocytes) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find GFAP in the default search locations, found in RNA assay instead
Warning: Could not find S100B in the default search locations, found in RNA assay instead
Warning: Could not find AQP4 in the default search locations, found in RNA assay instead
Warning: Could not find APOE in the default search locations, found in RNA assay instead
Warning: Could not find SOX9 in the default search locations, found in RNA assay instead

Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in radial_glia) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find PTPRC in the default search locations, found in RNA assay instead
Warning: Could not find AIF1 in the default search locations, found in RNA assay instead
Warning: Could not find ADGRE1 in the default search locations, found in RNA assay instead
Warning: Could not find VIM in the default search locations, found in RNA assay instead
Warning: Could not find PTPRZ1 in the default search locations, found in RNA assay instead
Warning: Could not find FAM107A in the default search locations, found in RNA assay instead
Warning: Could not find HOPX in the default search locations, found in RNA assay instead
Warning: Could not find ITGB5 in the default search locations, found in RNA assay instead
Warning: Could not find IL6ST in the default search locations, found in RNA assay instead

Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in mature_neurons) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find SYP in the default search locations, found in RNA assay instead
Warning in FetchData.Seurat(object = object, vars = c(dims, "ident", features),  :
  The following requested variables were not found: DLG45
Error: None of the requested features were found: DLG45 in slot data


Idents(integrated_seurat) <- "integrated_snn_res.0.3"

for (i in excitatory_neurons) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}
Warning: Could not find GRIN1 in the default search locations, found in RNA assay instead
Warning in FetchData.Seurat(object = object, vars = c(dims, "ident", features),  :
  The following requested variables were not found: GRIN3
Error: None of the requested features were found: GRIN3 in slot data

Add annotations - first pass NPC-stem NPC-glia NPC-SOX6 Neurons-Glut Progenitors-div NPC-SOX2-OXT-fibro Neural-Stem stem cell Neuron-GABA Neuron-epithelial


celltypes2 <- c("NPC","NPC","NPC","Neurons","NPC",
                "NPC","NPC","Stem","Neurons","Epithelial")  

integrated_seurat <- annotate(integrated_seurat, annotations = celltypes2, to_label = "integrated_snn_res.0.3",annotation_name = "Celltypes2")

DimPlot(integrated_seurat, label = TRUE)



DimPlot(integrated_seurat, split.by = "DiseaseStatus")

DimPlot(integrated_seurat, split.by = "DiseaseStatus", group.by = "Celltypes1")

NA
NA
celltypes3 <- c("NPC","NPC","NPC","Neurons","NPC-div",
                "Neuro-NPC","Neural-Stem","Stem","Neurons","Neural-epi")  
integrated_seurat <- annotate(integrated_seurat, annotations = celltypes3, to_label = "integrated_snn_res.0.3",annotation_name = "Celltypes3")

DimPlot(integrated_seurat, label = TRUE)

table(integrated_seurat$IPSC_Line)

 TD07  TD22 x2965 x3448 
 5310  6378  5957  6124 

DEG in cell types 3 groups

DGE <- FindMarkers(seu_sub, ident.1 = "PD", ident.2 = "Con")

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~12s          
  |++                                                | 2 % ~13s          
  |++                                                | 3 % ~13s          
  |+++                                               | 4 % ~13s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 9 % ~12s          
  |+++++                                             | 10% ~12s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~08s          
  |+++++++++++++++++++++                             | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=13s  
DimPlot(seu_sub, group.by = "DiseaseStatus")

table(seu_sub$DiseaseStatus)

 Con   PD 
1746 1647 

Neurons DGE volcano plot


library(EnhancedVolcano)
EnhancedVolcano(DGE,
    lab = rownames(DGE),
    #xlim = c(-0.25,0.25),
    x = 'avg_log2FC',
    y = 'p_val_adj',
    pCutoff = 0.000001,
    FCcutoff = 1,
    pointSize = 3.0,
    labSize = 6.0)

NA
NA
NA

DGE in NPCs: NPC-div

seu_sub <- subset(integrated_seurat, idents = "NPC-div")
dim(seu_sub)
[1] 58395  2936
table(seu_sub$IPSC_Line)

 TD07  TD22 x2965 x3448 
  753  1106   583   494 
table(seu_sub$DiseaseStatus)

 Con   PD 
1600 1336 
seu_sub <- ScaleData(seu_sub)
Centering and scaling data matrix

  |                                                                      
  |                                                                |   0%
  |                                                                      
  |=                                                               |   2%
  |                                                                      
  |==                                                              |   3%
  |                                                                      
  |===                                                             |   5%
  |                                                                      
  |====                                                            |   7%
  |                                                                      
  |=====                                                           |   8%
  |                                                                      
  |=======                                                         |  10%
  |                                                                      
  |========                                                        |  12%
  |                                                                      
  |=========                                                       |  14%
  |                                                                      
  |==========                                                      |  15%
  |                                                                      
  |===========                                                     |  17%
  |                                                                      
  |============                                                    |  19%
  |                                                                      
  |=============                                                   |  20%
  |                                                                      
  |==============                                                  |  22%
  |                                                                      
  |===============                                                 |  24%
  |                                                                      
  |================                                                |  25%
  |                                                                      
  |=================                                               |  27%
  |                                                                      
  |==================                                              |  29%
  |                                                                      
  |====================                                            |  31%
  |                                                                      
  |=====================                                           |  32%
  |                                                                      
  |======================                                          |  34%
  |                                                                      
  |=======================                                         |  36%
  |                                                                      
  |========================                                        |  37%
  |                                                                      
  |=========================                                       |  39%
  |                                                                      
  |==========================                                      |  41%
  |                                                                      
  |===========================                                     |  42%
  |                                                                      
  |============================                                    |  44%
  |                                                                      
  |=============================                                   |  46%
  |                                                                      
  |==============================                                  |  47%
  |                                                                      
  |===============================                                 |  49%
  |                                                                      
  |=================================                               |  51%
  |                                                                      
  |==================================                              |  53%
  |                                                                      
  |===================================                             |  54%
  |                                                                      
  |====================================                            |  56%
  |                                                                      
  |=====================================                           |  58%
  |                                                                      
  |======================================                          |  59%
  |                                                                      
  |=======================================                         |  61%
  |                                                                      
  |========================================                        |  63%
  |                                                                      
  |=========================================                       |  64%
  |                                                                      
  |==========================================                      |  66%
  |                                                                      
  |===========================================                     |  68%
  |                                                                      
  |============================================                    |  69%
  |                                                                      
  |==============================================                  |  71%
  |                                                                      
  |===============================================                 |  73%
  |                                                                      
  |================================================                |  75%
  |                                                                      
  |=================================================               |  76%
  |                                                                      
  |==================================================              |  78%
  |                                                                      
  |===================================================             |  80%
  |                                                                      
  |====================================================            |  81%
  |                                                                      
  |=====================================================           |  83%
  |                                                                      
  |======================================================          |  85%
  |                                                                      
  |=======================================================         |  86%
  |                                                                      
  |========================================================        |  88%
  |                                                                      
  |=========================================================       |  90%
  |                                                                      
  |===========================================================     |  92%
  |                                                                      
  |============================================================    |  93%
  |                                                                      
  |=============================================================   |  95%
  |                                                                      
  |==============================================================  |  97%
  |                                                                      
  |=============================================================== |  98%
  |                                                                      
  |================================================================| 100%
seu_sub <- NormalizeData(seu_sub)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Idents(seu_sub) <- "DiseaseStatus"
levels(seu_sub)
[1] "PD"  "Con"
DGE <- FindMarkers(seu_sub, ident.1 = "PD", ident.2 = "Con")

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 2 % ~12s          
  |++                                                | 3 % ~11s          
  |+++                                               | 4 % ~11s          
  |+++                                               | 5 % ~10s          
  |++++                                              | 6 % ~10s          
  |++++                                              | 7 % ~10s          
  |+++++                                             | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 12% ~09s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |+++++++++++++++                                   | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |++++++++++++++++                                  | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |+++++++++++++++++                                 | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |++++++++++++++++++++++++                          | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
DimPlot(seu_sub, group.by = "DiseaseStatus")

EnhancedVolcano(DGE,
    lab = rownames(DGE),
    #xlim = c(-0.25,0.25),
    x = 'avg_log2FC',
    y = 'p_val_adj',
    pCutoff = 0.000001,
    FCcutoff = 1,
    pointSize = 3.0,
    labSize = 6.0)

ft <- c("TEME132C","TMEM132D","GPC3","NRG1","PDE1A",
        "TTC6","SPON1","NTN1","PK1B","BNC2")

DotPlot(seu_sub, features = ft) +RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: TEME132C, PK1B
Warning: Scaling data with a low number of groups may produce misleading results

#head(DGE)
# filter for significant pvalues
DGE.ft <- DGE %>% filter(p_val_adj <= 0.01)
dim(DGE.ft)
[1] 544   5
up <- DGE.ft %>% filter(avg_log2FC > 0.1)
dim(up)
[1] 313   5
down <- DGE.ft %>% filter(avg_log2FC < -0.1)
dim(down)
[1] 231   5
Idents(seu_sub) <- "DiseaseStatus"
levels(seu_sub)
[1] "PD"  "Con"
DGE <- FindMarkers(seu_sub, ident.1 = "PD", ident.2 = "Con")

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 04s      
  |++                                                | 2 % ~57s          
  |++                                                | 3 % ~55s          
  |+++                                               | 4 % ~54s          
  |+++                                               | 5 % ~52s          
  |++++                                              | 6 % ~51s          
  |++++                                              | 7 % ~50s          
  |+++++                                             | 8 % ~49s          
  |+++++                                             | 9 % ~49s          
  |++++++                                            | 10% ~48s          
  |++++++                                            | 11% ~47s          
  |+++++++                                           | 12% ~46s          
  |+++++++                                           | 13% ~46s          
  |++++++++                                          | 14% ~45s          
  |++++++++                                          | 15% ~44s          
  |+++++++++                                         | 16% ~43s          
  |+++++++++                                         | 17% ~43s          
  |++++++++++                                        | 18% ~42s          
  |++++++++++                                        | 19% ~42s          
  |+++++++++++                                       | 20% ~41s          
  |+++++++++++                                       | 21% ~40s          
  |++++++++++++                                      | 22% ~40s          
  |++++++++++++                                      | 23% ~40s          
  |+++++++++++++                                     | 24% ~39s          
  |+++++++++++++                                     | 26% ~39s          
  |++++++++++++++                                    | 27% ~38s          
  |++++++++++++++                                    | 28% ~37s          
  |+++++++++++++++                                   | 29% ~37s          
  |+++++++++++++++                                   | 30% ~38s          
  |++++++++++++++++                                  | 31% ~37s          
  |++++++++++++++++                                  | 32% ~36s          
  |+++++++++++++++++                                 | 33% ~36s          
  |+++++++++++++++++                                 | 34% ~35s          
  |++++++++++++++++++                                | 35% ~35s          
  |++++++++++++++++++                                | 36% ~34s          
  |+++++++++++++++++++                               | 37% ~33s          
  |+++++++++++++++++++                               | 38% ~33s          
  |++++++++++++++++++++                              | 39% ~32s          
  |++++++++++++++++++++                              | 40% ~32s          
  |+++++++++++++++++++++                             | 41% ~31s          
  |+++++++++++++++++++++                             | 42% ~31s          
  |++++++++++++++++++++++                            | 43% ~30s          
  |++++++++++++++++++++++                            | 44% ~29s          
  |+++++++++++++++++++++++                           | 45% ~29s          
  |+++++++++++++++++++++++                           | 46% ~28s          
  |++++++++++++++++++++++++                          | 47% ~28s          
  |++++++++++++++++++++++++                          | 48% ~27s          
  |+++++++++++++++++++++++++                         | 49% ~27s          
  |+++++++++++++++++++++++++                         | 50% ~26s          
  |++++++++++++++++++++++++++                        | 51% ~26s          
  |+++++++++++++++++++++++++++                       | 52% ~25s          
  |+++++++++++++++++++++++++++                       | 53% ~24s          
  |++++++++++++++++++++++++++++                      | 54% ~24s          
  |++++++++++++++++++++++++++++                      | 55% ~23s          
  |+++++++++++++++++++++++++++++                     | 56% ~23s          
  |+++++++++++++++++++++++++++++                     | 57% ~22s          
  |++++++++++++++++++++++++++++++                    | 58% ~22s          
  |++++++++++++++++++++++++++++++                    | 59% ~21s          
  |+++++++++++++++++++++++++++++++                   | 60% ~21s          
  |+++++++++++++++++++++++++++++++                   | 61% ~20s          
  |++++++++++++++++++++++++++++++++                  | 62% ~19s          
  |++++++++++++++++++++++++++++++++                  | 63% ~19s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~18s          
  |++++++++++++++++++++++++++++++++++                | 66% ~17s          
  |++++++++++++++++++++++++++++++++++                | 67% ~17s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~16s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~15s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~14s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~13s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=50s  
DimPlot(seu_sub, group.by = "DiseaseStatus")

library(EnhancedVolcano)
EnhancedVolcano(DGE,
    lab = rownames(DGE),
    xlim = c(-3,3),
    x = 'avg_log2FC',
    y = 'p_val_adj',
    pCutoff = 0.01,
    FCcutoff = 1,
    pointSize = 3.0,
    labSize = 6.0)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...


ft <- c("RBFOX1","TMEM132C","GPC3","NRG1","LINGO2",
        "TTC6","SLIT1","CHN2","NTN1","ALK")

DotPlot(seu_sub, features = ft) +RotatedAxis()
Warning: Scaling data with a low number of groups may produce misleading results

#head(DGE)
# filter for significant pvalues
DGE.ft <- DGE %>% filter(p_val_adj <= 0.01)
dim(DGE.ft)
[1] 777   5
up <- DGE.ft %>% filter(avg_log2FC > 0.1)
dim(up)
[1] 383   5
down <- DGE.ft %>% filter(avg_log2FC < -0.1)
dim(down)
[1] 394   5

From the pseudo bulk

ft <- c("CLRN1","NR2E1","IFI44","DMRT3","FEZF2",
        "KCNJ16","RGPD2","CORIN","GALR1","SIM1")

DotPlot(seu_sub, features = ft) +RotatedAxis()
Warning: Scaling data with a low number of groups may produce misleading results

DGEup <- getGSA(DGE.ft, up_or_down = "up",
                LFCthresh = 0.02,
                pval_thresh = 0.05)
Uploading data to Enrichr... Done.
  Querying KEGG_2019_Human... Done.
  Querying GWAS_Catalog_2019... Done.
  Querying GO_Biological_Process_2023... Done.
  Querying GO_Cellular_Component_2023... Done.
  Querying GO_Molecular_Function_2023... Done.
Parsing results... Done.

DGEdown <- getGSA(DGE.ft, up_or_down = "down",
                LFCthresh = -0.02,
                pval_thresh = 0.05)
Uploading data to Enrichr... Done.
  Querying KEGG_2019_Human... Done.
  Querying GWAS_Catalog_2019... Done.
  Querying GO_Biological_Process_2023... Done.
  Querying GO_Cellular_Component_2023... Done.
  Querying GO_Molecular_Function_2023... Done.
Parsing results... Done.

DGEboth <- getGSA(DGE.ft, up_or_down = "both",
                LFCthresh = 0,
                pval_thresh = 0.01)
Uploading data to Enrichr... Done.
  Querying KEGG_2019_Human... Done.
  Querying GWAS_Catalog_2019... Done.
  Querying GO_Biological_Process_2023... Done.
  Querying GO_Cellular_Component_2023... Done.
  Querying GO_Molecular_Function_2023... Done.
Parsing results... Done.

The DGE.ft to compare to with the pseudobulk results

# write the DGE
write.csv(DGE.ft, "/Users/rhalenathomas/Documents/Data/scRNAseq/ParseExample/Experiment1-mini12/DGEseuratNPCs.csv")

Create a sum of counts data table

sum_counts <- AggregateExpression(integrated_seurat, assay = "RNA", group.by = "sample", add.ident = "sample")
# this seems to group by the group and the active ident together

colnames(integrated_seurat@meta.data)
dim(sum_counts$RNA)
sum_counts_df <- as.data.frame(sum_counts$RNA)
dim(sum_counts_df)
write.csv(sum_counts_df, "/Users/rhalenathomas/Documents/Data/scRNAseq/ParseExample/Experiment1-mini12/SumCounts_Integrated_by_sample_celltype.csv")
sum_counts_df[1:4,1:5]

Try to separately variables in the aggregation

colnames(integrated_seurat@meta.data)

sum_counts <- AggregateExpression(integrated_seurat, assay = "RNA", group.by = c("Batch","IPSC_Line","DiseaseStatus"))
# this seems to group by the group and the active ident together



colnames(integrated_seurat@meta.data)
dim(sum_counts$RNA)
sum_counts_df <- as.data.frame(sum_counts$RNA)
dim(sum_counts_df)

# all cell types are integrated

write.csv(sum_counts_df, "/Users/rhalenathomas/Documents/Data/scRNAseq/ParseExample/Experiment1-mini12/SumCounts_Integrated_allCelltypes_12samples.csv")

Try to make the MDS plots and the DESeq2 DGE

library( "DESeq2" )
library(ggplot2)

Visualize groups

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUGlsb3QgZGF0YSBQYXJzZSBiaW8gNCBpUFNDIGxpbmVzIE5QQ3MsIDMgYmF0Y2hlcwoKTG9hZCBsaWJyYXJpZXMKYGBge3J9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKI2xpYnJhcnkoQ2VsbHR5cGVSKQoKYGBgCgoKYGBge3J9CgojIHJlYWQgaW4gdGhlIGRhdGEKIyBvdXRwdXQgZnJvbSBQYXJzZSBiaW8gcGlwZWxpbmUgYWRhcHRlZCBieSBTYWVpZAojIHJ1biBieSBUYXlsb3IKIyBkYXRhIG9iamVjdCBtYWRlIGJ5IFRheWxvcgpzZXUgPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGFyc2VFeGFtcGxlL0V4cGVyaW1lbnQxLW1pbmkxMi9TZXVyYXRfUGFyc2UxMnNhbXBsZS5SRFMiKQoKIyB0aGlzIGRhdGEgb2JqZWN0IGhhcyBub3QgYmVlbiBmaWx0ZXJlZAojIGl0IGRvZXMgaGF2ZSBQQ0EgYW5kIHZhcmlhYmxlIGZlYXR1cmVzCnNldQoKYGBgCmBgYHtyfQoKc2V1W1sicGVyY2VudC5tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChzZXUsIHBhdHRlcm4gPSAiXk1ULSIpCklkZW50cyhzZXUpIDwtICdvcmlnLmlkZW50JwpwbG90IDwtIFZsblBsb3Qoc2V1LCBwdC5zaXplID0gMC4wMDEsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBuY29sID0gMykKcGxvdAoKSWRlbnRzKHNldSkgPC0gJ3NhbXBsZScKVmxuUGxvdChzZXUsIHB0LnNpemUgPSAwLjAwMSwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSkKVmxuUGxvdChzZXUsIHB0LnNpemUgPSAwLjAwMSwgZmVhdHVyZXMgPSAibkNvdW50X1JOQSIpClZsblBsb3Qoc2V1LCBwdC5zaXplID0gMC4wMDEsIGZlYXR1cmVzID0gInBlcmNlbnQubXQiKQoKCgpgYGAKCkFkZCBpbiBsYWJlbHMgZm9yIGJhdGNoIGFuZCBkaXNlYXNlIHN0YXR1cyBhbmQgbGluZQoKYGBge3J9CiNsaWJyYXJ5KCJDZWxsdHlwZVIiKQojIENlbGx0eXBlUiBsaWJyYXJ5IGlzIGEgbGlicmFyeSBJIChSaGFsZW5hKSBtYWRlIGZvciBmbG93IGN5dG9tZXRyeSBidXQgdXNlcyB0aGUgc2V1cmF0IG9iamVjdCBhbmQgSSBtYWRlIGEgcXVpY2sgYWRkIGFubm90YXRpb25zIGZ1bmN0aW9uLgoKU2V1cmF0X1BhcnNlMTJzYW1wbGUgPC0gc2V1CgojIGhlcmUgaXMgdGhlIGZ1bmN0aW9uCmFubm90YXRlIDwtIGZ1bmN0aW9uKHNldSwgYW5ub3RhdGlvbnMsIHRvX2xhYmVsLCBhbm5vdGF0aW9uX25hbWUgPSAiQ2VsbFR5cGUiKXsKICBJZGVudHMoc2V1KSA8LSB0b19sYWJlbAogIG5hbWVzKGFubm90YXRpb25zKSA8LSBsZXZlbHMoc2V1KQogIHNldSA8LSBSZW5hbWVJZGVudHMoc2V1LCBhbm5vdGF0aW9ucykKICBzZXUgPC0gQWRkTWV0YURhdGEob2JqZWN0PXNldSwgbWV0YWRhdGE9SWRlbnRzKHNldSksIGNvbC5uYW1lID0gYW5ub3RhdGlvbl9uYW1lKQoKfQoKSWRlbnRzKFNldXJhdF9QYXJzZTEyc2FtcGxlKSA8LSAic2FtcGxlIgpzYW1wbGUubGV2ZWxzIDwtIGxldmVscyhTZXVyYXRfUGFyc2UxMnNhbXBsZSkKIyBzaG91bGQgZ2l2ZSB0aGUgb3JkZXIgb2Ygc2FtcGxlCgojIHRlc3QKU2V1cmF0X1BhcnNlMTJzYW1wbGUgPC0gYW5ub3RhdGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUsIGFubm90YXRpb25zID0gc2FtcGxlLmxldmVscywgdG9fbGFiZWwgPSAic2FtcGxlIixhbm5vdGF0aW9uX25hbWUgPSAic2FtcGxlLnRlc3QiKQp0YWJsZShTZXVyYXRfUGFyc2UxMnNhbXBsZSRzYW1wbGUudGVzdCkKdGFibGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUkc2FtcGxlKQojIHRoZXNlIG1hdGNoCgojaW5wdXQgdmVjdG9yIHdlIGdvdCBmcm9tIHRoZSBzZXVyYXQgb2JqZWN0CiMgRGVmaW5lIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBmaXJzdCBwYXJ0IG9mIHRoZSBzdHJpbmcKcGF0dGVybiA8LSAiXltBLVphLXpdKyIKCiMgVXNlIGdzdWIoKSB0byByZXBsYWNlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgd2l0aCBhbiBlbXB0eSBzdHJpbmcKc2FtcGxlLmxldmVscy5uZXcgPC0gZ3N1YihwYXR0ZXJuLCAiIiwgc2FtcGxlLmxldmVscykKCiMgRXh0cmFjdCBCMSwgQjIsIEIzIGZyb20gbmV3IHZlY3RvcgpiYXRjaCA8LSBnc3ViKCIuKkIiLCAiQiIsIHNhbXBsZS5sZXZlbHMubmV3KQoKU2V1cmF0X1BhcnNlMTJzYW1wbGUgPC0gYW5ub3RhdGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUsIGFubm90YXRpb25zID0gYmF0Y2gsIHRvX2xhYmVsID0gInNhbXBsZSIsYW5ub3RhdGlvbl9uYW1lID0gIkJhdGNoIikKCnRhYmxlKFNldXJhdF9QYXJzZTEyc2FtcGxlJEJhdGNoKQp0YWJsZShTZXVyYXRfUGFyc2UxMnNhbXBsZSRCYXRjaCxTZXVyYXRfUGFyc2UxMnNhbXBsZSRzYW1wbGUpCgojIGFkZCB0aGUgY2VsbCBsaW5lIG5hbWUKIyBzYW1wbGUgdmVjdG9yIGlzIHN0aWxsIHRoZSBpbnB1dCB2ZWN0b3IKIyBEZWZpbmUgcmVndWxhciBleHByZXNzaW9uIHRvIHJlbW92ZSBCMSwgQjIsIGFuZCBCMwpwYXR0ZXJuIDwtICJCWzEtM10kIgoKIyBVc2UgZ3N1YigpIHRvIHJlbW92ZSBCMSwgQjIsIGFuZCBCMyBmcm9tIG9yaWdpbmFsIHZlY3RvcgpzYW1wbGUubGV2ZWxzLm5ldyA8LSBnc3ViKHBhdHRlcm4sICIiLCBzYW1wbGUubGV2ZWxzKQoKIyBFeHRyYWN0IHN0YXJ0aW5nIHZhbHVlcyBmcm9tIG5ldyB2ZWN0b3IKaXBzY2xpbmUgPC0gZ3N1YigiQlsxLTNdJCIsICIiLCBzYW1wbGUubGV2ZWxzLm5ldykKaXBzY2xpbmUKClNldXJhdF9QYXJzZTEyc2FtcGxlIDwtIGFubm90YXRlKFNldXJhdF9QYXJzZTEyc2FtcGxlLCBhbm5vdGF0aW9ucyA9IGlwc2NsaW5lLCB0b19sYWJlbCA9ICJzYW1wbGUiLGFubm90YXRpb25fbmFtZSA9ICJJUFNDX0xpbmUiKQoKdGFibGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUkSVBTQ19MaW5lKQp0YWJsZShTZXVyYXRfUGFyc2UxMnNhbXBsZSRJUFNDX0xpbmUsU2V1cmF0X1BhcnNlMTJzYW1wbGUkc2FtcGxlKQoKIyBhZGQgZGlzZWFzZSBzdGF0dXMKIyB3ZSBuZWVkIHRvIGtub3cgdGhlIG9yZGVyIG9mIHRoZSBsaW5lcwoKSWRlbnRzKFNldXJhdF9QYXJzZTEyc2FtcGxlKSA8LSAiSVBTQ19MaW5lIgpsaW5lLmxldmVscyA8LSBsZXZlbHMoU2V1cmF0X1BhcnNlMTJzYW1wbGUpCmxpbmUubGV2ZWxzCgpQRHN0YXR1cyA8LSBjKCJQRCIsIlBEIiwiQ29uIiwiQ29uIikgICMgaWYgVEQwNyBhbmQgMjk2NSBhcmUgUEQgbGluZXMgYW5kIFREMjIgYW5kIDM0NDggYXJlIGNvbnRyb2wgbGluZXMKU2V1cmF0X1BhcnNlMTJzYW1wbGUgPC0gYW5ub3RhdGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUsIGFubm90YXRpb25zID0gUERzdGF0dXMsIHRvX2xhYmVsID0gIklQU0NfTGluZSIsYW5ub3RhdGlvbl9uYW1lID0gIkRpc2Vhc2VTdGF0dXMiKQoKdGFibGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUkRGlzZWFzZVN0YXR1cykKCiAKdGFibGUoU2V1cmF0X1BhcnNlMTJzYW1wbGUkRGlzZWFzZVN0YXR1cyxTZXVyYXRfUGFyc2UxMnNhbXBsZSRJUFNDX0xpbmUpCgp0YWJsZShTZXVyYXRfUGFyc2UxMnNhbXBsZSRCYXRjaCxTZXVyYXRfUGFyc2UxMnNhbXBsZSRJUFNDX0xpbmUpCgoKCgpgYGAKCgpTYXZlIGluZm8gCmBgYHtyfQpzYXZlUkRTKFNldXJhdF9QYXJzZTEyc2FtcGxlLCAiUGFyc2UxMnNhbXBsZTRsaW5lczNiYXRjaEp1bHk3LlJEUyIpCgpzZXUgPC0gU2V1cmF0X1BhcnNlMTJzYW1wbGUKcm0oU2V1cmF0X1BhcnNlMTJzYW1wbGUpCgojIHBsb3RzIG9mIGluIGEgZGlmZmVyZW50IHdvcmtib29rIGZvciB0aGUgcHJlIGFsaWduZWQgZGF0YQoKYGBgCgpBbGlnbiB0aGUgY2VsbCBsaW5lcyBhbmQgYmF0Y2hlcywgd2Ugd2lsbCBhbGlnbiBhY3Jvc3MgdGhlIDEyIHNhbXBsZXMKCmBgYHtyfQojIG1ha2UgYSBsaXN0IG9mIHNldXJhdCBvYmplY3RzIGJ5IG91ciBjZWxsIHR5cGUgdmFyaWFibGUKc3VibGlzdCA8LSBTcGxpdE9iamVjdChzZXUsIHNwbGl0LmJ5ID0gInNhbXBsZSIpCiMgbm9ybWFsaXplIGFuZCBmaW5kIHZhcmlhYmxlIGZlYXR1cmVzCmZvciAoaSBpbiAxOmxlbmd0aChzdWJsaXN0KSl7CiAgc3VibGlzdFtbaV1dIDwtIE5vcm1hbGl6ZURhdGEoc3VibGlzdFtbaV1dLCB2ZXJib3NlID0gRkFMU0UpCiAgc3VibGlzdFtbaV1dIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKHN1Ymxpc3RbW2ldXSwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiKQp9CiMgQ3JlYXRlIGFuIGVtcHR5IFNldXJhdCBvYmplY3QgdG8gc3RvcmUgdGhlIGludGVncmF0ZWQgZGF0YQojIFRha2UgdGhlIGZpcnN0IFNldXJhdCBvYmplY3QgZnJvbSB0aGUgbGlzdCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQKaW50ZWdyYXRlZF9zZXVyYXQgPC0gc3Vic2V0KHN1Ymxpc3RbWzFdXSkKCgojIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBTZXVyYXQgb2JqZWN0cwpmb3IgKGkgaW4gMTpsZW5ndGgoc3VibGlzdCkpIHsKICAjIFJlbmFtZSB0aGUgJ29yaWcuaWRlbnQnIG1ldGFkYXRhIGluc2lkZSB0aGUgc2V1cmF0IG9iamVjdCB0byBtYXRjaCB0aGUgb2JqZWN0IG5hbWUgaW4gdGhlIGxpc3QKICBzdWJsaXN0W1tpXV0kb3JpZy5pZGVudCA8LSBuYW1lcyhzdWJsaXN0KVtpXQoKfQoKc2FtcGxlLmxpc3QgPC0gc3VibGlzdApmb3IgKGkgaW4gMTpsZW5ndGgoc2FtcGxlLmxpc3QpKSB7CiAgIyBOb3JtYWxpemUgYW5kIHNjYWxlIHRoZSBkYXRhCiAgc2FtcGxlLmxpc3RbW2ldXSA8LSBOb3JtYWxpemVEYXRhKHNhbXBsZS5saXN0W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSkKICBzYW1wbGUubGlzdFtbaV1dIDwtIFNjYWxlRGF0YShzYW1wbGUubGlzdFtbaV1dLCB2ZXJib3NlID0gRkFMU0UpCiAgIyBGaW5kIHZhcmlhYmxlIGZlYXR1cmVzCiAgc2FtcGxlLmxpc3RbW2ldXSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhzYW1wbGUubGlzdFtbaV1dLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIpCiAgIyBHZXQgdGhlIHZhcmlhYmxlIGZlYXR1cmVzCiAgdmFyaWFibGVfZmVhdHVyZXMgPC0gVmFyaWFibGVGZWF0dXJlcyhzYW1wbGUubGlzdFtbaV1dKQogICMgUnVuIFBDQSB3aXRoIHRoZSB2YXJpYWJsZSBmZWF0dXJlcwogIHNhbXBsZS5saXN0W1tpXV0gPC0gUnVuUENBKHNhbXBsZS5saXN0W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbnBjcyA9IDMwLCBmZWF0dXJlcyA9IHZhcmlhYmxlX2ZlYXR1cmVzKQp9CgppbnQuYW5jaG9ycyA8LSBGaW5kSW50ZWdyYXRpb25BbmNob3JzKG9iamVjdC5saXN0ID0gc2FtcGxlLmxpc3QsIGRpbXMgPSAxOjMwLCByZWR1Y3Rpb24gPSAicnBjYSIpCmludGVncmF0ZWRfc2V1cmF0IDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gaW50LmFuY2hvcnMsICBkaW1zID0gMTozMCkKIyAKIyBtdXN0IHNldCB0aGUgayB3ZWlnaHQgdG8gdGhlIGxvd2VzdCBjZWxsIGNvdW50IAojIGluIHRoZSBwYXJzZSBzYW1wbGUgd2UgaGF2ZSBvdmVyIDE1MzAgY2VsbHMgaW4gdGhlIHNtYWxsZXN0IGNvdW50IHNvIHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlIHRoZSBrIGZyb20gdGhlIDEwMCBkZWZhdWx0CgoKCgpgYGAKCgpOb3cgd2UgbmVlZCB0byBydW4gdGhlIHdvcmtmbG93IG9uIHRoZSBpbnRlZ3JhdGVkIG9iamVjdAoKYGBge3J9CkRlZmF1bHRBc3NheShpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWQiCmludGVncmF0ZWRfc2V1cmF0IDwtIFNjYWxlRGF0YShpbnRlZ3JhdGVkX3NldXJhdCwgdmVyYm9zZSA9IEZBTFNFKQojIG9ubHkgdGhlIGludGVncmF0ZWQgZmVhdHVyZXMgd2lsbCBiZSB0aGUgcGNhIGlucHV0CgppbnRlZ3JhdGVkX3NldXJhdCA8LSBSdW5QQ0EoaW50ZWdyYXRlZF9zZXVyYXQsIG5wY3MgPSAyMCwgdmVyYm9zZSA9IEZBTFNFKQppbnRlZ3JhdGVkX3NldXJhdCA8LSBSdW5VTUFQKGludGVncmF0ZWRfc2V1cmF0LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MjAsIG4ubmVpZ2hib3JzID0gODEpCgpgYGAKCkhhdmUgYSBsb29rIGF0IHRoZSBuZXcgVU1BUAoKYGBge3J9CkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gJ3NhbXBsZScpCkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gJ0JhdGNoJykKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAnRGlzZWFzZVN0YXR1cycpCkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gJ0lQU0NfTGluZScpCgoKCmBgYAoKYGBge3J9CnNhdmVSRFMoaW50ZWdyYXRlZF9zZXVyYXQsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QYXJzZUV4YW1wbGUvRXhwZXJpbWVudDEtbWluaTEyL0ludGVncmF0ZWQxMnNhbXBsZXMuUkRTIikKIyBzZXR3ZCgifi9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QYXJzZUV4YW1wbGUvRXhwZXJpbWVudDEtbWluaTEyIikKaW50ZWdyYXRlZF9zZXVyYXQgPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGFyc2VFeGFtcGxlL0V4cGVyaW1lbnQxLW1pbmkxMi9JbnRlZ3JhdGVkMTJzYW1wbGVzLlJEUyIpCgpgYGAKCkZpbmQgbmV3IGNsdXN0ZXJzCgpgYGB7cn0KRGVmYXVsdEFzc2F5KGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZCIKaW50ZWdyYXRlZF9zZXVyYXQgPC0gRmluZE5laWdoYm9ycyhpbnRlZ3JhdGVkX3NldXJhdCwgZGltcyA9IDE6MjAsIGsucGFyYW0gPSA4MSkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gRmluZENsdXN0ZXJzKGludGVncmF0ZWRfc2V1cmF0LCByZXNvbHV0aW9uID0gYygwLDAuMywwLjYsMSkgKQoKYGBgCgpgYGB7cn0KbGlicmFyeShjbHVzdHJlZSkKY2x1c3RyZWUoaW50ZWdyYXRlZF9zZXVyYXQpCgoKYGBgCgpgYGB7cn0KCkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4wLjMiKQpEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC42IikKCmBgYApgYGB7cn0KRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuMyIsIHNwbGl0LmJ5ID0gIkRpc2Vhc2VTdGF0dXMiKQoKYGBgCmBgYHtyfQp0YWJsZShpbnRlZ3JhdGVkX3NldXJhdCREaXNlYXNlU3RhdHVzKQoKYGBgCgoKCgpBbm5vdGF0ZSBjbHVzdGVycyByZXMgMC4zCgpgYGB7cn0KCklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4wLjMiCkNsdXN0ZXJNYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGludGVncmF0ZWRfc2V1cmF0LCBvbmx5LnBvcyA9IFRSVUUpCndyaXRlLmNzdihDbHVzdGVyTWFya2VycywgImNsdXN0ZXJNYXJrZXJzcmVzMDNJbnRlZ3JhdGVkLmNzdiIpCgpgYGAKCgoKYGBge3J9CmxpYnJhcnkoZW5yaWNoUikKc2V0RW5yaWNoclNpdGUoIkVucmljaHIiKSAjIEh1bWFuIGdlbmVzCiMgbGlzdCBvZiBhbGwgdGhlIGRhdGFiYXNlcwojIGdldCB0aGUgcG9zc2libGUgbGlicmFyaWVzCmRicyA8LSBsaXN0RW5yaWNockRicygpCgojIHRoaXMgd2lsbCBsaXN0IHRoZSBwb3NzaWJsZSBsaWJyYXJpZXMKZGJzCgojIHNlbGVjdCBsaWJyYXJpZXMgd2l0aCBjZWxsIHR5cGVzCmRiIDwtIGMoJ0NlbGxNYXJrZXJfQXVnbWVudGVkXzIwMjEnLCdBemltdXRoX0NlbGxfVHlwZXNfMjAyMScpCgojIGZ1bmN0aW9uIGZvciBhIHF1aWNrIGxvb2sKY2hlY2tDZWxsdHlwZXMgPC0gZnVuY3Rpb24oY2x1c3Rlcl9udW0gPSAwKXsKICBjbHVzdGVyWCA8LSBDbHVzdGVyTWFya2VycyAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gY2x1c3Rlcl9udW0gJiBhdmdfbG9nMkZDID4gMC4yNSkKICBnZW5lcyA8LSBjbHVzdGVyWCRnZW5lCiAgIyB0aGUgY2VsbCB0eXBlIGxpYnJhcmllcwogICMgZ2V0IHRoZSByZXN1bHRzIGZvciBlYWNoIGxpYnJhcnkKICBjbHVzdGVyWC5jZWxsIDwtIGVucmljaHIoZ2VuZXMsIGRhdGFiYXNlcyA9IGRiKQogICMgdmlzdWFsaXplIHRoZSByZXN1bHRzCnByaW50KHBsb3RFbnJpY2goY2x1c3RlclguY2VsbFtbMV1dLCBzaG93VGVybXMgPSAyMCwgbnVtQ2hhciA9IDQwLCB5ID0gIkNvdW50Iiwgb3JkZXJCeSA9ICJQLnZhbHVlIiwgdGl0bGUgPSAnQ2VsbE1hcmtlcl9BdWdtZW50ZWRfMjAyMScpKQpwcmludChwbG90RW5yaWNoKGNsdXN0ZXJYLmNlbGxbWzJdXSwgc2hvd1Rlcm1zID0gMjAsIG51bUNoYXIgPSA0MCwgeSA9ICJDb3VudCIsIG9yZGVyQnkgPSAiUC52YWx1ZSIsIHRpdGxlID0gJ0F6aW11dGhfQ2VsbF9UeXBlc18yMDIxJykpCgp9CgpgYGAKYGBge3J9CiNoZWF0bWFwIG9mIHRvcCBtYXJrZXJzCnRvcDMgPC0gQ2x1c3Rlck1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPTMsIHd0ID1hdmdfbG9nMkZDKQpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gdG9wMyRnZW5lLCBzaXplID0gMywgYW5nbGUgPSA5MCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuMyIpCgoKYGBgCgpgYGB7cn0KdGFibGUoQ2x1c3Rlck1hcmtlcnMkY2x1c3RlcikKYGBgCgoKCgpDaGVjayBlYWNoIGNsdXN0ZXIgcXVpY2tseQoKYGBge3J9CmNoZWNrQ2VsbHR5cGVzKGNsdXN0ZXJfbnVtID0gMykKCmBgYAoKTG9vayBhdCBzb21lIGV4cHJlc3Npb24gbGlzdHMKCmBgYHtyfQoKZGFfbmV1cm9ucyA8LSBjKCJUSCIsIlNMQzZBMyIsIlNMQzE4QTIiLCJTT1g2IiwiTkRORiIsIlNOQ0ciLCJBTERIMUExIiwiQ0FMQjEiLCJUQUNSMiIsIlNMQzE3QTYiLCJTTEMzMkExIiwiT1RYMiIsIkdSUCIsIkxQTCIsIkNDSyIsIlZJUCIpCk5QQ19vclN0ZW1MaWtlIDwtIGMoIkRDWCIsIk5FVVJPRDEiLCJUQlIxIiwiUENOQSIsIk1LSTY3IiwiU09YMiIsIk5FUyIsIlBBWDYiLCJNQVNIMSIpCm1hdHVyZV9uZXVyb25zID0gYygiUkJGT1gzIiwiU1lQIiwiRExHNDUiLCJWQU1QMSIsIlZBTVAyIiwiVFVCQjMiLCJTWVQxIiwiQlNOIiwiSE9NRVIxIiwiU0xDMTdBNiIpCmV4Y2l0YXRvcnlfbmV1cm9ucyA9IGMoIkdSSUEyIiwiR1JJQTEiLCJHUklBNCIsIkdSSU4xIiwiR1JJTjJCIiwiR1JJTjJBIiwiR1JJTjNBIiwiR1JJTjMiLCJHUklQMSIsIkNBTUsyQSIpCmluaGJpdG9yeV9uZXVyb25zID0gaW5oID0gYygiR0FEMSIsIkdBRDIiLCAiR0FUMSIsIlBWQUxCIiwiR0FCUjIiLCJHQUJSMSIsIkdCUlIxIiwiR0FCUkIyIiwiR0FCUkIxIiwiR0FCUkIzIiwiR0FCUkE2IiwiR0FCUkExIiwiR0FCUkE0IiwiVFJBSzIiKQphc3Ryb2N5dGVzIDwtIGMoIkdGQVAiLCJTMTAwQiIsIkFRUDQiLCJBUE9FIiwgIlNPWDkiLCJTTEMxQTMiKQpvbGlnb2RlbmRyb2N5dGVzIDwtIGMoIk1CUCIsIk1PRyIsIk9MSUcxIiwiT0xJRzIiLCJTT1gxMCIpCm9wYyA8LSAKcmFkaWFsX2dsaWEgPC0gYygiUFRQUkMiLCJBSUYxIiwiQURHUkUxIiwgIlZJTSIsICJUTkMiLCJQVFBSWjEiLCJGQU0xMDdBIiwiSE9QWCIsIkxJRlIiLAogICAgICAgICAgICAgICJJVEdCNSIsIklMNlNUIiwiU0xDMUEzIikKZXBpdGhlbGlhbCA8LSBjKCJIRVMxIiwiSEVTNSIsIlNPWDIiLCJTT1gxMCIsIk5FUyIsIkNESDEiLCJOT1RDSDEiKQoKbWljcm9nbGlhIDwtIGMoIklCQTEiLCJQMlJZMTIiLCJQMlJZMTMiLCJUUkVNMTE5IiwgIkdQUjM0IiwiU0lHTEVDSCIsIlRSRU0yIiwKICAgICAgICAgICAgICAgIkNYM0NSMSIsIkZDUkxTIiwiT0xGTUwzIiwiSEVYQiIsIlRHRkJSMSIsICJTQUxMMSIsIk1FUlRLIiwKICAgICAgICAgICAgICAgIlBST1MxIikKCmZlYXR1cmVzX2xpc3QgPC0gYygiTUtJNjciLCJTT1gyIiwiUE9VNUYxIiwiRExYMiIsIlBBWDYiLCJTT1g5IiwiSEVTMSIsIk5FUyIsIlJCRk9YMyIsIk1BUDIiLCJOQ0FNMSIsIkNEMjQiLCJHUklBMiIsIkdSSU4yQiIsIkdBQkJSMSIsIkdBRDEiLCJHQUQyIiwiR0FCUkExIiwiR0FCUkIyIiwiVEgiLCJBTERIMUExIiwiTE1YMUIiLCJOUjRBMiIsIkNPUklOIiwiQ0FMQjEiLCJLQ05KNiIsIkNYQ1I0IiwiSVRHQTYiLCJTTEMxQTMiLCJDRDQ0IiwiQVFQNCIsIlMxMDBCIiwgIlBER0ZSQSIsIk9MSUcyIiwiTUJQIiwiQ0xETjExIiwiVklNIiwiVkNBTTEiKQoKc2hvcnRfbGlzdCA8LSBjKCJNS0k2NyIsIlNPWDkiLCJIRVMxIiwiTkVTIiwiRExYMiIsIlJCRk9YMyIsIk1BUDIiLCJUSCIsIkNBTEIxIiwiS0NOSjYiLCJTTEMxQTMiLCJDRDQ0IiwiQVFQNCIsIlMxMDBCIiwiT0xJRzIiLCJNQlAiLCJWSU0iKQoKYGBgCgoKYGBge3J9CklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4wLjMiCgpmb3IgKGkgaW4gZGFfbmV1cm9ucykgewogIHByaW50KEZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KCmBgYAoKYGBge3J9CklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4wLjMiCgpmb3IgKGkgaW4gTlBDX29yU3RlbUxpa2UpIHsKICBwcmludChGZWF0dXJlUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSBpLCBtaW4uY3V0b2ZmID0gJ3ExJywgbWF4LmN1dG9mZiA9ICdxOTcnLCBsYWJlbCA9IFRSVUUpKQp9CmBgYAoKYGBge3J9CklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4wLjMiCgpmb3IgKGkgaW4gYXN0cm9jeXRlcykgewogIHByaW50KEZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KYGBgCgpgYGB7cn0KSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuMyIKCmZvciAoaSBpbiByYWRpYWxfZ2xpYSkgewogIHByaW50KEZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KCmBgYAoKCmBgYHtyfQpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC4zIgoKZm9yIChpIGluIG1hdHVyZV9uZXVyb25zKSB7CiAgcHJpbnQoRmVhdHVyZVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gaSwgbWluLmN1dG9mZiA9ICdxMScsIG1heC5jdXRvZmYgPSAncTk3JywgbGFiZWwgPSBUUlVFKSkKfQoKCmBgYAoKYGBge3J9CgpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC4zIgoKZm9yIChpIGluIGV4Y2l0YXRvcnlfbmV1cm9ucykgewogIHByaW50KEZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KCgpgYGAKQWRkIGFubm90YXRpb25zIC0gZmlyc3QgcGFzcwpOUEMtc3RlbQpOUEMtZ2xpYQpOUEMtU09YNgpOZXVyb25zLUdsdXQKUHJvZ2VuaXRvcnMtZGl2Ck5QQy1TT1gyLU9YVC1maWJybwpOZXVyYWwtU3RlbQpzdGVtIGNlbGwKTmV1cm9uLUdBQkEKTmV1cm9uLWVwaXRoZWxpYWwKCmBgYHtyfQpjZWxsdHlwZXMxIDwtIGMoIk5QQy1zdGVtIiwiTlBDLWdsaWEiLCJOUEMtU09YNiIsIk5ldXJvbnMtR2x1dCIsIlByb2dlbml0b3JzLWRpdiIsCiAgICAgICAgICAgICAgICAiTlBDLWZpYnJvIiwiTmV1cmFsLVN0ZW0iLCJTdGVtIiwiTmV1cm9ucy1HQUJBIiwiTmV1cmFsLWVwaSIpICAKaW50ZWdyYXRlZF9zZXVyYXQgPC0gYW5ub3RhdGUoaW50ZWdyYXRlZF9zZXVyYXQsIGFubm90YXRpb25zID0gY2VsbHR5cGVzMSwgdG9fbGFiZWwgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuMyIsYW5ub3RhdGlvbl9uYW1lID0gIkNlbGx0eXBlczEiKQoKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgbGFiZWwgPSBUUlVFKQoKYGBgCgpgYGB7cn0KCmNlbGx0eXBlczIgPC0gYygiTlBDIiwiTlBDIiwiTlBDIiwiTmV1cm9ucyIsIk5QQyIsCiAgICAgICAgICAgICAgICAiTlBDIiwiTlBDIiwiU3RlbSIsIk5ldXJvbnMiLCJFcGl0aGVsaWFsIikgIAoKaW50ZWdyYXRlZF9zZXVyYXQgPC0gYW5ub3RhdGUoaW50ZWdyYXRlZF9zZXVyYXQsIGFubm90YXRpb25zID0gY2VsbHR5cGVzMiwgdG9fbGFiZWwgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuMyIsYW5ub3RhdGlvbl9uYW1lID0gIkNlbGx0eXBlczIiKQoKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgbGFiZWwgPSBUUlVFKQoKYGBgCgpgYGB7cn0KCgpEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBzcGxpdC5ieSA9ICJEaXNlYXNlU3RhdHVzIikKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgc3BsaXQuYnkgPSAiRGlzZWFzZVN0YXR1cyIsIGdyb3VwLmJ5ID0gIkNlbGx0eXBlczEiKQoKCmBgYAoKYGBge3J9CmNlbGx0eXBlczMgPC0gYygiTlBDIiwiTlBDIiwiTlBDIiwiTmV1cm9ucyIsIk5QQy1kaXYiLAogICAgICAgICAgICAgICAgIk5ldXJvLU5QQyIsIk5ldXJhbC1TdGVtIiwiU3RlbSIsIk5ldXJvbnMiLCJOZXVyYWwtZXBpIikgIAppbnRlZ3JhdGVkX3NldXJhdCA8LSBhbm5vdGF0ZShpbnRlZ3JhdGVkX3NldXJhdCwgYW5ub3RhdGlvbnMgPSBjZWxsdHlwZXMzLCB0b19sYWJlbCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC4zIixhbm5vdGF0aW9uX25hbWUgPSAiQ2VsbHR5cGVzMyIpCgpEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBsYWJlbCA9IFRSVUUpCmBgYApgYGB7cn0KdGFibGUoaW50ZWdyYXRlZF9zZXVyYXQkSVBTQ19MaW5lKQpgYGAKCgoKREVHIGluIGNlbGwgdHlwZXMgMyBncm91cHMKCmBgYHtyfQpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJSTkEiCklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIkNlbGx0eXBlczMiCmxldmVscyhpbnRlZ3JhdGVkX3NldXJhdCkKc2V1X3N1YiA8LSBzdWJzZXQoaW50ZWdyYXRlZF9zZXVyYXQsIGlkZW50cyA9ICJOZXVyb25zIikKZGltKHNldV9zdWIpCnRhYmxlKHNldV9zdWIkSVBTQ19MaW5lKQpzZXVfc3ViIDwtIFNjYWxlRGF0YShzZXVfc3ViKQpzZXVfc3ViIDwtIE5vcm1hbGl6ZURhdGEoc2V1X3N1YikKCklkZW50cyhzZXVfc3ViKSA8LSAiRGlzZWFzZVN0YXR1cyIKbGV2ZWxzKHNldV9zdWIpCkRHRSA8LSBGaW5kTWFya2VycyhzZXVfc3ViLCBpZGVudC4xID0gIlBEIiwgaWRlbnQuMiA9ICJDb24iKQpEaW1QbG90KHNldV9zdWIsIGdyb3VwLmJ5ID0gIkRpc2Vhc2VTdGF0dXMiKQoKCmBgYApgYGB7cn0KdGFibGUoc2V1X3N1YiREaXNlYXNlU3RhdHVzKQpgYGAKCgpOZXVyb25zIERHRSB2b2xjYW5vIHBsb3QKCmBgYHtyLCBmaWcuaGVpZ2h0PSAzfQoKbGlicmFyeShFbmhhbmNlZFZvbGNhbm8pCkVuaGFuY2VkVm9sY2FubyhER0UsCiAgICBsYWIgPSByb3duYW1lcyhER0UpLAogICAgI3hsaW0gPSBjKC0wLjI1LDAuMjUpLAogICAgeCA9ICdhdmdfbG9nMkZDJywKICAgIHkgPSAncF92YWxfYWRqJywKICAgIHBDdXRvZmYgPSAwLjAwMDAwMSwKICAgIEZDY3V0b2ZmID0gMSwKICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgIGxhYlNpemUgPSA2LjApCgoKCmBgYAoKYGBge3J9CmZ0IDwtIGMoIk1HQVQ0QyIsIlRCUjEiLCJTTEM0QTEwIiwiUkVMTiIsIlBUUFJEIiwKICAgICAgICAiR1BDNSIsIlNJTTEiLCJPTkVDVVQyIiwiRUJGMSIsIkxNWDFBIikKCkRvdFBsb3Qoc2V1X3N1YiwgZmVhdHVyZXMgPSBmdCkgK1JvdGF0ZWRBeGlzKCkKCmhlYWQoREdFKQojIGZpbHRlciBmb3Igc2lnbmlmaWNhbnQgcHZhbHVlcwpER0UuZnQgPC0gREdFICU+JSBmaWx0ZXIocF92YWxfYWRqIDw9IDAuMDEpCnVwIDwtIERHRS5mdCAlPiUgZmlsdGVyKGF2Z19sb2cyRkMgPiAwLjEpCmRvd24gPC0gREdFLmZ0ICU+JSBmaWx0ZXIoYXZnX2xvZzJGQyA8IC0wLjEpCgoKYGBgCgpER0UgaW4gTlBDczogTlBDLWRpdgoKYGBge3J9CkRlZmF1bHRBc3NheShpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIlJOQSIKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiQ2VsbHR5cGVzMyIKbGV2ZWxzKGludGVncmF0ZWRfc2V1cmF0KQpzZXVfc3ViIDwtIHN1YnNldChpbnRlZ3JhdGVkX3NldXJhdCwgaWRlbnRzID0gIk5QQy1kaXYiKQpkaW0oc2V1X3N1YikKdGFibGUoc2V1X3N1YiRJUFNDX0xpbmUpCnRhYmxlKHNldV9zdWIkRGlzZWFzZVN0YXR1cykKc2V1X3N1YiA8LSBTY2FsZURhdGEoc2V1X3N1YikKc2V1X3N1YiA8LSBOb3JtYWxpemVEYXRhKHNldV9zdWIpCgpJZGVudHMoc2V1X3N1YikgPC0gIkRpc2Vhc2VTdGF0dXMiCmxldmVscyhzZXVfc3ViKQpER0UgPC0gRmluZE1hcmtlcnMoc2V1X3N1YiwgaWRlbnQuMSA9ICJQRCIsIGlkZW50LjIgPSAiQ29uIikKRGltUGxvdChzZXVfc3ViLCBncm91cC5ieSA9ICJEaXNlYXNlU3RhdHVzIikKCgpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTN9CkVuaGFuY2VkVm9sY2FubyhER0UsCiAgICBsYWIgPSByb3duYW1lcyhER0UpLAogICAgI3hsaW0gPSBjKC0wLjI1LDAuMjUpLAogICAgeCA9ICdhdmdfbG9nMkZDJywKICAgIHkgPSAncF92YWxfYWRqJywKICAgIHBDdXRvZmYgPSAwLjAwMDAwMSwKICAgIEZDY3V0b2ZmID0gMSwKICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgIGxhYlNpemUgPSA2LjApCmBgYApgYGB7cn0KZnQgPC0gYygiVEVNRTEzMkMiLCJUTUVNMTMyRCIsIkdQQzMiLCJOUkcxIiwiUERFMUEiLAogICAgICAgICJUVEM2IiwiU1BPTjEiLCJOVE4xIiwiUEsxQiIsIkJOQzIiKQoKRG90UGxvdChzZXVfc3ViLCBmZWF0dXJlcyA9IGZ0KSArUm90YXRlZEF4aXMoKQoKI2hlYWQoREdFKQojIGZpbHRlciBmb3Igc2lnbmlmaWNhbnQgcHZhbHVlcwpER0UuZnQgPC0gREdFICU+JSBmaWx0ZXIocF92YWxfYWRqIDw9IDAuMDEpCmRpbShER0UuZnQpCnVwIDwtIERHRS5mdCAlPiUgZmlsdGVyKGF2Z19sb2cyRkMgPiAwLjEpCmRpbSh1cCkKZG93biA8LSBER0UuZnQgJT4lIGZpbHRlcihhdmdfbG9nMkZDIDwgLTAuMSkKZGltKGRvd24pCmBgYAoKYGBge3J9CgojIG1haW4gTlBDIGdyb3VwCkRlZmF1bHRBc3NheShpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIlJOQSIKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiQ2VsbHR5cGVzMyIKbGV2ZWxzKGludGVncmF0ZWRfc2V1cmF0KQpzZXVfc3ViIDwtIHN1YnNldChpbnRlZ3JhdGVkX3NldXJhdCwgaWRlbnRzID0gIk5QQyIpCmRpbShzZXVfc3ViKQp0YWJsZShzZXVfc3ViJElQU0NfTGluZSkKdGFibGUoc2V1X3N1YiREaXNlYXNlU3RhdHVzKQojc2V1X3N1YiA8LSBTY2FsZURhdGEoc2V1X3N1YikKc2V1X3N1YiA8LSBOb3JtYWxpemVEYXRhKHNldV9zdWIpCgpJZGVudHMoc2V1X3N1YikgPC0gIkRpc2Vhc2VTdGF0dXMiCmxldmVscyhzZXVfc3ViKQpER0UgPC0gRmluZE1hcmtlcnMoc2V1X3N1YiwgaWRlbnQuMSA9ICJQRCIsIGlkZW50LjIgPSAiQ29uIikKRGltUGxvdChzZXVfc3ViLCBncm91cC5ieSA9ICJEaXNlYXNlU3RhdHVzIikKCmBgYApgYGB7ciwgZmlnLmhlaWdodD0zfQpsaWJyYXJ5KEVuaGFuY2VkVm9sY2FubykKRW5oYW5jZWRWb2xjYW5vKERHRSwKICAgIGxhYiA9IHJvd25hbWVzKERHRSksCiAgICB4bGltID0gYygtMywzKSwKICAgIHggPSAnYXZnX2xvZzJGQycsCiAgICB5ID0gJ3BfdmFsX2FkaicsCiAgICBwQ3V0b2ZmID0gMC4wMSwKICAgIEZDY3V0b2ZmID0gMSwKICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgIGxhYlNpemUgPSA2LjApCgpgYGAKCmBgYHtyfQoKZnQgPC0gYygiUkJGT1gxIiwiVE1FTTEzMkMiLCJHUEMzIiwiTlJHMSIsIkxJTkdPMiIsCiAgICAgICAgIlRUQzYiLCJTTElUMSIsIkNITjIiLCJOVE4xIiwiQUxLIikKCkRvdFBsb3Qoc2V1X3N1YiwgZmVhdHVyZXMgPSBmdCkgK1JvdGF0ZWRBeGlzKCkKCiNoZWFkKERHRSkKIyBmaWx0ZXIgZm9yIHNpZ25pZmljYW50IHB2YWx1ZXMKREdFLmZ0IDwtIERHRSAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8PSAwLjAxKQpkaW0oREdFLmZ0KQp1cCA8LSBER0UuZnQgJT4lIGZpbHRlcihhdmdfbG9nMkZDID4gMC4xKQpkaW0odXApCmRvd24gPC0gREdFLmZ0ICU+JSBmaWx0ZXIoYXZnX2xvZzJGQyA8IC0wLjEpCmRpbShkb3duKQpgYGAKCkZyb20gdGhlIHBzZXVkbyBidWxrCmBgYHtyfQpmdCA8LSBjKCJDTFJOMSIsIk5SMkUxIiwiSUZJNDQiLCJETVJUMyIsIkZFWkYyIiwKICAgICAgICAiS0NOSjE2IiwiUkdQRDIiLCJDT1JJTiIsIkdBTFIxIiwiU0lNMSIpCgpEb3RQbG90KHNldV9zdWIsIGZlYXR1cmVzID0gZnQpICtSb3RhdGVkQXhpcygpCmBgYAoKCmBgYHtyfQoKbGlicmFyeShlbnJpY2hSKQpzZXRFbnJpY2hyU2l0ZSgiRW5yaWNociIpICMgSHVtYW4gZ2VuZXMKIyBsaXN0IG9mIGFsbCB0aGUgZGF0YWJhc2VzCiMgZ2V0IHRoZSBwb3NzaWJsZSBsaWJyYXJpZXMKZGJzIDwtIGxpc3RFbnJpY2hyRGJzKCkKCiMgdGhpcyB3aWxsIGxpc3QgdGhlIHBvc3NpYmxlIGxpYnJhcmllcwpkYnMKCiMgc2VsZWN0IGxpYnJhcmllcyB3aXRoIGNlbGwgdHlwZXMKZGIgPC0gYygnS0VHR18yMDE5X0h1bWFuJywnR1dBU19DYXRhbG9nXzIwMTknLCJHT19CaW9sb2dpY2FsX1Byb2Nlc3NfMjAyMyIsCiAgICAgICAgIkdPX0NlbGx1bGFyX0NvbXBvbmVudF8yMDIzIiwiR09fTW9sZWN1bGFyX0Z1bmN0aW9uXzIwMjMiKQoKIyB1c2Ugb25seSB0aGUgc2lnbmlmaWNhbnQgYWZ0ZXIgcCBhZGp1c3RlZCBnZW5lcwojIGFkZCBnZW5lcyBjb2x1bW4gdG8gREdFIGl0IGlzIFggaWYgc2F2ZWQgdG8gY3N2CkRHRS5mdCRYIDwtIHJvd25hbWVzKERHRS5mdCkKCiMgZnVuY3Rpb24gZm9yIGEgcXVpY2sgbG9vawpnZXRHU0EgPC0gZnVuY3Rpb24oZGF0YWZyYW1lLCB1cF9vcl9kb3duID0gInVwIiwgTEZDdGhyZXNoID0gMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwdmFsX3RocmVzaCA9IDAuMDUpewogIGlmKHVwX29yX2Rvd24gPT0gInVwIil7CiAgICAgIGdlbmVsaXN0IDwtIGRhdGFmcmFtZSAlPiUgZmlsdGVyKGF2Z19sb2cyRkMgPj0gTEZDdGhyZXNoICYgcF92YWxfYWRqIDwgcHZhbF90aHJlc2gpCiAgfWVsc2UgaWYgKHVwX29yX2Rvd24gPT0gImRvd24iKSB7CiAgICAgIGdlbmVsaXN0IDwtIGRhdGFmcmFtZSAlPiUgZmlsdGVyKGF2Z19sb2cyRkMgPD0gTEZDdGhyZXNoICYgcF92YWxfYWRqIDwgcHZhbF90aHJlc2gpCiAgfSBlbHNlIHsKICAgIGdlbmVsaXN0IDwtIGRhdGFmcmFtZSAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IHB2YWxfdGhyZXNoKQogIH0KZ2VuZXMgPC0gZ2VuZWxpc3QkWAogICMgdGhlIGNlbGwgdHlwZSBsaWJyYXJpZXMKICAjIGdldCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBsaWJyYXJ5CiAgcmVzdWx0cyA8LSBlbnJpY2hyKGdlbmVzLCBkYXRhYmFzZXMgPSBkYikKICAjIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cwogIApwcmludChwbG90RW5yaWNoKHJlc3VsdHNbWzFdXSwgc2hvd1Rlcm1zID0gMjAsIG51bUNoYXIgPSA0MCwgeSA9ICJDb3VudCIsIG9yZGVyQnkgPSAiUC52YWx1ZSIsIHRpdGxlID0gJ0tFR0cnKSkKcHJpbnQocGxvdEVucmljaChyZXN1bHRzW1syXV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdHV0FTJykpCnByaW50KHBsb3RFbnJpY2gocmVzdWx0c1tbM11dLCBzaG93VGVybXMgPSAyMCwgbnVtQ2hhciA9IDQwLCB5ID0gIkNvdW50Iiwgb3JkZXJCeSA9ICJQLnZhbHVlIiwgdGl0bGUgPSAnR09iaW8nKSkKcHJpbnQocGxvdEVucmljaChyZXN1bHRzW1s0XV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdHT2NlbGwnKSkKcHJpbnQocGxvdEVucmljaChyZXN1bHRzW1s1XV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdHT21vbCcpKQpyZXR1cm4ocmVzdWx0cykKfQoKREdFdXAgPC0gZ2V0R1NBKERHRS5mdCwgdXBfb3JfZG93biA9ICJ1cCIsCiAgICAgICAgICAgICAgICBMRkN0aHJlc2ggPSAwLjAyLAogICAgICAgICAgICAgICAgcHZhbF90aHJlc2ggPSAwLjA1KQoKCmBgYAoKYGBge3J9CkRHRWRvd24gPC0gZ2V0R1NBKERHRS5mdCwgdXBfb3JfZG93biA9ICJkb3duIiwKICAgICAgICAgICAgICAgIExGQ3RocmVzaCA9IC0wLjAyLAogICAgICAgICAgICAgICAgcHZhbF90aHJlc2ggPSAwLjA1KQpgYGAKCmBgYHtyfQpER0Vib3RoIDwtIGdldEdTQShER0UuZnQsIHVwX29yX2Rvd24gPSAiYm90aCIsCiAgICAgICAgICAgICAgICBMRkN0aHJlc2ggPSAwLAogICAgICAgICAgICAgICAgcHZhbF90aHJlc2ggPSAwLjAxKQoKYGBgCgpUaGUgREdFLmZ0IHRvIGNvbXBhcmUgdG8gd2l0aCB0aGUgcHNldWRvYnVsayByZXN1bHRzCgpgYGB7cn0KIyB3cml0ZSB0aGUgREdFCndyaXRlLmNzdihER0UuZnQsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QYXJzZUV4YW1wbGUvRXhwZXJpbWVudDEtbWluaTEyL0RHRXNldXJhdE5QQ3MuY3N2IikKCgpgYGAKCgoKQ3JlYXRlIGEgc3VtIG9mIGNvdW50cyBkYXRhIHRhYmxlIAoKYGBge3J9CnN1bV9jb3VudHMgPC0gQWdncmVnYXRlRXhwcmVzc2lvbihpbnRlZ3JhdGVkX3NldXJhdCwgYXNzYXkgPSAiUk5BIiwgZ3JvdXAuYnkgPSAic2FtcGxlIiwgYWRkLmlkZW50ID0gInNhbXBsZSIpCiMgdGhpcyBzZWVtcyB0byBncm91cCBieSB0aGUgZ3JvdXAgYW5kIHRoZSBhY3RpdmUgaWRlbnQgdG9nZXRoZXIKCmNvbG5hbWVzKGludGVncmF0ZWRfc2V1cmF0QG1ldGEuZGF0YSkKZGltKHN1bV9jb3VudHMkUk5BKQpzdW1fY291bnRzX2RmIDwtIGFzLmRhdGEuZnJhbWUoc3VtX2NvdW50cyRSTkEpCmRpbShzdW1fY291bnRzX2RmKQp3cml0ZS5jc3Yoc3VtX2NvdW50c19kZiwgIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1BhcnNlRXhhbXBsZS9FeHBlcmltZW50MS1taW5pMTIvU3VtQ291bnRzX0ludGVncmF0ZWRfYnlfc2FtcGxlX2NlbGx0eXBlLmNzdiIpCnN1bV9jb3VudHNfZGZbMTo0LDE6NV0KCgoKYGBgCgoKVHJ5IHRvIHNlcGFyYXRlbHkgdmFyaWFibGVzIGluIHRoZSBhZ2dyZWdhdGlvbgoKYGBge3J9CmNvbG5hbWVzKGludGVncmF0ZWRfc2V1cmF0QG1ldGEuZGF0YSkKCnN1bV9jb3VudHMgPC0gQWdncmVnYXRlRXhwcmVzc2lvbihpbnRlZ3JhdGVkX3NldXJhdCwgYXNzYXkgPSAiUk5BIiwgZ3JvdXAuYnkgPSBjKCJCYXRjaCIsIklQU0NfTGluZSIsIkRpc2Vhc2VTdGF0dXMiKSkKIyB0aGlzIHNlZW1zIHRvIGdyb3VwIGJ5IHRoZSBncm91cCBhbmQgdGhlIGFjdGl2ZSBpZGVudCB0b2dldGhlcgoKCgpjb2xuYW1lcyhpbnRlZ3JhdGVkX3NldXJhdEBtZXRhLmRhdGEpCmRpbShzdW1fY291bnRzJFJOQSkKc3VtX2NvdW50c19kZiA8LSBhcy5kYXRhLmZyYW1lKHN1bV9jb3VudHMkUk5BKQpkaW0oc3VtX2NvdW50c19kZikKCiMgYWxsIGNlbGwgdHlwZXMgYXJlIGludGVncmF0ZWQKCndyaXRlLmNzdihzdW1fY291bnRzX2RmLCAiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGFyc2VFeGFtcGxlL0V4cGVyaW1lbnQxLW1pbmkxMi9TdW1Db3VudHNfSW50ZWdyYXRlZF9hbGxDZWxsdHlwZXNfMTJzYW1wbGVzLmNzdiIpCgoKYGBgCgoKVHJ5IHRvIG1ha2UgdGhlIE1EUyBwbG90cyBhbmQgdGhlIERFU2VxMiBER0UKCmBgYHtyfQpsaWJyYXJ5KCAiREVTZXEyIiApCmxpYnJhcnkoZ2dwbG90MikKCmBgYAoKVmlzdWFsaXplIGdyb3VwcwoKYGBge3J9CkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gIkNlbGx0eXBlczMiLCBzcGxpdC5ieSA9ICJCYXRjaCIpCkRpbVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gIkNlbGx0eXBlczMiLCBzcGxpdC5ieSA9ICJEaXNlYXNlU3RhdHVzIikKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiQ2VsbHR5cGVzMyIsIAogICAgICAgIHNwbGl0LmJ5ID0gInNhbXBsZSIsIG5jb2wgPSA0KQoKRGltUGxvdChzZXVfc3ViLCBncm91cC5ieSA9ICJEaXNlYXNlU3RhdHVzIiwKICAgICAgICBzcGxpdC5ieSA9ICJCYXRjaCIpCkRpbVBsb3Qoc2V1X3N1YiwgCiAgICAgICAgc3BsaXQuYnkgPSAic2FtcGxlIiwgbmNvbCA9IDQpCgpgYGAKCgoK